package student.design_pattern.listener_pattern;

import java.util.EventListener;
import java.util.EventObject;

/**
 * 监听器模式：
 *     角色： 1. 事件类，用来定义事件源，传入事件值；
 *           2. 监听器，用来定义处理事件方式，传入事件对象；
 */
class MyEvent1 extends EventObject {

    /**
     * 一般应用框架内部实现，无需开发者创建
     * @param source 包含事件所需信息的对象
     */
    public MyEvent1(Object source) {
        super(source);
    }
}

class MyEvent2 extends EventObject {

    /**
     * 一般应用框架内部实现，无需开发者创建
     * @param source 包含事件所需信息的对象
     */
    public MyEvent2(Object source) {
        super(source);
    }
}

/**
 * 监听器，变化处理者
 */
class MyListener implements EventListener {
    /**
     * 一般有开发者继承实现，自定义事件处理函数
     * @param e 事件
     */
    void onEvent(EventObject e) {
        if (e instanceof MyEvent1) {
            System.out.println("MyEvent1 ==> come");
        } else if (e instanceof MyEvent2) {
            System.out.println("MyEvent2 ==> come");
        }
    }
}
 
public class TestListener {

    public static void main(String[] args) {
        // 一般应用启动时生成监听器，需要自己继承实现监听器处理方法
        MyListener listener = new MyListener();
        // 应用框架在合适时机生成事件对象，一般无需开发者实现
        EventObject event1 = new MyEvent1("some useful info event1");
        EventObject event2 = new MyEvent2("some useful info event2");
        // 应用框架在事件生成后调用事件回调函数，调用时机由应用框架处理
        listener.onEvent(event1);
        listener.onEvent(event2);
    }

}
